package Day012_多线程2.demo01_synchronized关键字;

/**
 * @author zhangyan
 * @date 2020/4/30 10:28
 */
/*
    同步方法不需要自己写锁对象,是固定的,系统默认的
    对于非static方法,同步锁就是this。
    对于static方法,我们使用当前方法所在类的字节码对象(类名.class)

    如果线程A使用同步代码块,线程B使用同步方法,线程A B要实现同步,
    那么线程A的同步代码块锁对象和线程B的同步方法的锁对象一致.
        线程B 非静态--this  --> 线程A代同步码块的锁对象就需要是this
        线程B 静态--类名.class  --> 线程A代同步码块的锁对象就需要是类名.class
 */
public class demo03_同步方法 {
    public static void main(String[] args) {
        //创建线程任务对象
        MyRunnable2 mr = new MyRunnable2();
        //创建三个窗口对象
        Thread t1 = new Thread(mr, "窗口1");
        Thread t2 = new Thread(mr, "窗口2");
        Thread t3 = new Thread(mr, "窗口3");
        //同时卖票
        t1.start();
        t2.start();
        t3.start();
    }
}

class MyRunnable2 implements Runnable {
    int ticket = 100;

    public void run() {
        //每个窗口卖票的操作
        //死循环卖票
        while (true) {
            //票卖完,就结束循环
            if (sellTicket()) {
                break;
            }
        }
    }

    public synchronized boolean sellTicket() {
        if (ticket < 1) {
            return true;
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //获取当前线程对象的名字
        String name = Thread.currentThread().getName();
        System.out.println(name + "正在卖第:" + ticket + "张票");
        ticket--;
        return false;
    }
}




